#include <my_header.h>
#include "queue.h"
#include <mysql/mysql.h>


#define LENGTH 4096
#define MAX_PATH_LEN 1024
#define STACK_SIZE 100

// 设计线程的结构
typedef struct pool_s{
    // 存储子线程id的数组
    pthread_t *pthread_id;
    // 记录池中有多少个子线程
    int num;

    // 存入任务/客户端连接的队列
    queue_t queue;
    // 维护一个访问共享资源的锁
    pthread_mutex_t pthread_lock;
    // 条件遍历
    pthread_cond_t cond;

    // 退出标记位
    int exit_tag;
}pool_t;

// 枚举类型记录各个命令头
typedef enum{
    cd, ls, pwd, upload, download, mk_dir, rm_dir,undo_rm
}COMMAND;

// 定义栈
typedef struct {
    char paths[STACK_SIZE][MAX_PATH_LEN];
    char init_order[20];
    char init_path[20];
    int top;
} PathStack;

// 初始化子线程
int init_pool(pool_t *p_pool, int num);

// 子线程的入口函数
void * pthread_fun(void *p);

// 初始化socket连接
int init_tcp(int *socket_fd, char *ip, char *port);

// 添加epoll监听
int add_epoll(int epoll_fd, int file_fd);

// 向指定客户端发送文件, client_download
int send_bigfile(int socket_fd, char *name, char *uname, MYSQL *mysql);

// 从指定客户端接收文件, client_upload
int recv_bigfile(int socket_fd, char *name, char *uname, MYSQL *mysql);

//ls命令
int client_ls(MYSQL *conn, int net_fd, char *uname, char *cur_path);

// 查看当前路径
int client_pwd(PathStack *stack , int net_fd);

// 新建文件夹
int client_mkdir(char *cur_path, int net_fd, char *order, MYSQL* mysql, char  *uname);

// 删除文件夹/文件
int client_rm(MYSQL *conn, int net_fd, char *cur_path, const char *file_name, char *last_deleted_file, char *last_deleted_path);

//撤销最近一次删除
int client_undo_rm(MYSQL *conn, int net_fd, char *last_deleted_file, char *last_deleted_path);

// 切换路径
int client_cd(int net_fd,MYSQL *conn,char *order,char *cur_path);

// 登陆检查
void login_check(int net_fd, int *flag_break, char *uname);

// 初始化栈
void initPathStack(PathStack *stack, char *user);

// 入栈
int pathPush(PathStack *stack, const char *path);

// 出栈
int pathPop(PathStack *stack, char *path);

// 访问栈顶元素
int pathPeek(const PathStack *stack, char *path);

// 在数据库中查询用户名
int check_uname(char *uname);

// 在数据库中查询盐值
int get_salt(char *uname, char *salt);

// 在数据库中查询密码哈希值
int get_passwd(char *uname, char *passwd);

// 加盐
int add_salt(char *salt);

// 将用户信息存入数据库
int user_info_store(char *uname, char *salt, char *passwd);
